{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "#竞赛的评价指标为logloss\n",
    "from sklearn.metrics import log_loss  \n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n",
    "\n",
    "#读取数据\n",
    "alldata = pd.read_csv(\"diabetes.csv\")\n",
    "alldata.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "alldata.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 各属性的统计特性\n",
    "alldata.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x864c4e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Outcome 分布，看看各类样本分布是否均衡\n",
    "sns.countplot(alldata.Outcome);\n",
    "pyplot.xlabel('Outcome');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#将Y和X基提取出来\n",
    "y = alldata['Outcome']\n",
    "X_all = alldata.drop(['Outcome'],axis=1)\n",
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train,y_test = train_test_split(X_all,y,random_state=33,test_size=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(614, 8)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(154, 8)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-0.56251713 -0.33302989  0.25176713 ...  0.05822773  0.69029401\n",
      "  -0.52785121]\n",
      " [ 0.93265827  1.77405666  0.74930501 ...  0.98157033 -0.4225542\n",
      "   0.63887777]\n",
      " [-1.16058729  0.53459398 -0.4447859  ...  0.32907489  0.19299944\n",
      "  -1.02787792]\n",
      " ...\n",
      " [-0.56251713  1.68109696  0.94832017 ... -1.11133957 -0.43771562\n",
      "  -0.94454013]\n",
      " [ 0.33458811  1.40221785  0.35127471 ...  1.69562194 -0.39526365\n",
      "  -0.52785121]\n",
      " [-0.26348205  0.16275518  0.94832017 ...  0.90770292  0.70848771\n",
      "  -0.52785121]]\n"
     ]
    }
   ],
   "source": [
    "X_train = ss_X.fit_transform(X_train)\n",
    "X_test = ss_X.transform(X_test)\n",
    "print(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "614\n"
     ]
    }
   ],
   "source": [
    "print(y_train.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [0.46129644 0.46510588 0.56426612 0.44377717 0.46617809]\n",
      "cv logloss is: 0.48012474004701106\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\Anaconda2\\lib\\site-packages\\sklearn\\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "# 交叉验证用于评估模型性能和进行参数调优（模型选择）\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "lr= LogisticRegression()\n",
    "#分类任务中交叉验证缺省是采用StratifiedKFold\n",
    "from sklearn.cross_validation import cross_val_score\n",
    "loss = cross_val_score(lr, X_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "print 'logloss of each fold is: ',-loss\n",
    "print'cv logloss is:', -loss.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.0001, 0.001, 0.1, 1, 10, 100]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.0001, 0.001, 0.1, 1, 10, 100]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "lr_penalty= LogisticRegression()\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='neg_log_loss')\n",
    "grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([0.00200009, 0.00320001, 0.00240002, 0.00340009, 0.00359998,\n",
       "        0.00400004, 0.00240002, 0.00480003, 0.00359998, 0.00300007,\n",
       "        0.00259995, 0.00259995]),\n",
       " 'mean_score_time': array([0.00339994, 0.00359998, 0.00240002, 0.00219989, 0.00479999,\n",
       "        0.00159993, 0.00199995, 0.00380001, 0.002     , 0.00239997,\n",
       "        0.0012001 , 0.00240002]),\n",
       " 'mean_test_score': array([-0.69314718, -0.68659497, -0.69314718, -0.64214833, -0.48659005,\n",
       "        -0.47999943, -0.48043635, -0.48017599, -0.48090132, -0.48086932,\n",
       "        -0.48095298, -0.48095123]),\n",
       " 'mean_train_score': array([-0.69314718, -0.6864897 , -0.69314718, -0.6412946 , -0.47502463,\n",
       "        -0.46674403, -0.46228805, -0.46214818, -0.46206769, -0.46206619,\n",
       "        -0.46206531, -0.4620653 ]),\n",
       " 'param_C': masked_array(data=[0.0001, 0.0001, 0.001, 0.001, 0.1, 0.1, 1, 1, 10, 10,\n",
       "                    100, 100],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1',\n",
       "                    'l2', 'l1', 'l2'],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 0.0001, 'penalty': 'l1'},\n",
       "  {'C': 0.0001, 'penalty': 'l2'},\n",
       "  {'C': 0.001, 'penalty': 'l1'},\n",
       "  {'C': 0.001, 'penalty': 'l2'},\n",
       "  {'C': 0.1, 'penalty': 'l1'},\n",
       "  {'C': 0.1, 'penalty': 'l2'},\n",
       "  {'C': 1, 'penalty': 'l1'},\n",
       "  {'C': 1, 'penalty': 'l2'},\n",
       "  {'C': 10, 'penalty': 'l1'},\n",
       "  {'C': 10, 'penalty': 'l2'},\n",
       "  {'C': 100, 'penalty': 'l1'},\n",
       "  {'C': 100, 'penalty': 'l2'}],\n",
       " 'rank_test_score': array([11, 10, 11,  9,  8,  1,  3,  2,  5,  4,  7,  6]),\n",
       " 'split0_test_score': array([-0.69314718, -0.68682793, -0.69314718, -0.64371675, -0.48618018,\n",
       "        -0.4678555 , -0.46345983, -0.46129644, -0.46108765, -0.46088502,\n",
       "        -0.46086836, -0.4608487 ]),\n",
       " 'split0_train_score': array([-0.69314718, -0.68637921, -0.69314718, -0.64085132, -0.47823507,\n",
       "        -0.47085398, -0.46684264, -0.46669378, -0.46662381, -0.46662226,\n",
       "        -0.46662151, -0.46662149]),\n",
       " 'split1_test_score': array([-0.69314718, -0.68647305, -0.69314718, -0.64113725, -0.47167693,\n",
       "        -0.47077815, -0.46426486, -0.46510588, -0.46463679, -0.46473286,\n",
       "        -0.46468834, -0.46469927]),\n",
       " 'split1_train_score': array([-0.69314718, -0.68657476, -0.69314718, -0.64188719, -0.47970408,\n",
       "        -0.47076994, -0.46692724, -0.46678157, -0.4667161 , -0.4667146 ,\n",
       "        -0.4667139 , -0.46671388]),\n",
       " 'split2_test_score': array([-0.69314718, -0.68698087, -0.69314718, -0.64575466, -0.54752569,\n",
       "        -0.54301469, -0.56469297, -0.56426612, -0.56847916, -0.56834734,\n",
       "        -0.56879907, -0.56879096]),\n",
       " 'split2_train_score': array([-0.69314718, -0.68623543, -0.69314718, -0.63908575, -0.45564343,\n",
       "        -0.44783203, -0.44194647, -0.44184498, -0.44173182, -0.44173047,\n",
       "        -0.44172921, -0.4417292 ]),\n",
       " 'split3_test_score': array([-0.69314718, -0.68619969, -0.69314718, -0.63856226, -0.45503238,\n",
       "        -0.44706595, -0.44365963, -0.44377717, -0.44397839, -0.44400066,\n",
       "        -0.44402864, -0.4440332 ]),\n",
       " 'split3_train_score': array([-0.69314718, -0.68672568, -0.69314718, -0.64333601, -0.48382552,\n",
       "        -0.47509784, -0.47066666, -0.47052445, -0.47044458, -0.47044314,\n",
       "        -0.47044228, -0.47044226]),\n",
       " 'split4_test_score': array([-0.69314718, -0.68648733, -0.69314718, -0.64152376, -0.47216456,\n",
       "        -0.47104103, -0.46582468, -0.46617809, -0.4660649 , -0.46612355,\n",
       "        -0.46612304, -0.4661268 ]),\n",
       " 'split4_train_score': array([-0.69314718, -0.68653345, -0.69314718, -0.64131272, -0.47771506,\n",
       "        -0.46916638, -0.46505725, -0.46489609, -0.46482215, -0.46482048,\n",
       "        -0.46481966, -0.46481964]),\n",
       " 'std_fit_time': array([0.00063241, 0.00193903, 0.00120009, 0.0012    , 0.00119999,\n",
       "        0.00260767, 0.0004899 , 0.0024819 , 0.00135647, 0.00109554,\n",
       "        0.00048998, 0.0012    ]),\n",
       " 'std_score_time': array([0.0010198 , 0.00135651, 0.0004898 , 0.00039995, 0.00416642,\n",
       "        0.0004899 , 0.00126486, 0.0011662 , 0.00109541, 0.00079987,\n",
       "        0.00039999, 0.00080003]),\n",
       " 'std_test_score': array([0.        , 0.0002777 , 0.        , 0.00243715, 0.03205704,\n",
       "        0.03276814, 0.04294072, 0.04285084, 0.04453507, 0.04448689,\n",
       "        0.04466504, 0.04466183]),\n",
       " 'std_train_score': array([0.        , 0.00016834, 0.        , 0.00138524, 0.00992501,\n",
       "        0.00965834, 0.01033359, 0.01031565, 0.01033124, 0.01033118,\n",
       "        0.01033136, 0.01033136])}"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.4799994349368312\n",
      "{'penalty': 'l2', 'C': 0.1}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xbb44860>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "#将负数修正为正数，值越小则性能越好\n",
    "test_means = -grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = -grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    pyplot.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'neg-logloss' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
